BITS 32
%include "macrosmodoprotegido.mac"

%define fondoNegro 0x00
%define colorVerde 0x2F
%define colorRojo 0x4F
%define colorCeleste 0x3F
%define colorAzul 0x1F
%define colorFucsia 0x5F

extern identificarTarea
extern posicionCodigo
extern posicionStack
extern posicionShared

global dibujar_codigo
global dibujar_stack
global dibujar_shared
global pintar_codigo
global pintar_stack
global pintar_shared
global limpiar_codigo
global limpiar_stack
global limpiar_shared
global borrar_codigo
global borrar_stack
global borrar_shared

;defines de los nombres de registros
textoShared: db "s"
textoCodigo: db "C"
textoStack:  db "P"
espacioBlanco: db " "

dibujar_codigo:
	mov eax, cr3
	push eax
	call identificarTarea
	add esp, 4
	mov ebx, eax	; guardamos en ebx la tarea
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	mov eax, cr3
	push eax
	call posicionCodigo
	add esp,4
	;eax tiene el indice del codigo
	
	push eax
	push ebx
	call pintar_codigo
	add esp, 8

.fin:	
	ret

dibujar_stack:
	mov eax, cr3
	push eax
	call identificarTarea
	add esp, 4
	mov ebx, eax	; guardamos en ebx la tarea
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	mov eax, cr3
	push eax
	call posicionStack
	add esp,4
	;eax tiene el indice del stack
	
	push eax
	push ebx
	call pintar_stack
	add esp, 8

.fin:	
	ret
	
dibujar_shared:
	mov eax, cr3
	push eax
	call identificarTarea
	add esp, 4
	mov ebx, eax	; guardamos en ebx la tarea
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	mov eax, cr3
	push eax
	call posicionShared
	add esp,4
	;eax tiene el indice del shared
	
	push eax
	push ebx
	call pintar_shared
	add esp, 8

.fin:	
	ret
	
pintar_codigo:
	mov ebx, [esp+4]	; guardamos en ebx la tarea
	mov eax, [esp+8]	; guardamos en eax el indice del codigo
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
		
	;calculamos las decenas
	mov ecx, eax
	xor edx, edx
.calcularDecenas:
	cmp ecx, 10
	jl .unidades
	inc edx
	sub ecx, 10
	jmp .calcularDecenas
	; edx tiene las decenas
	
.unidades:
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx	;le restamos las decenas
	
	xor ecx, ecx
.calcularUnidades:
	cmp eax, 0
	je .imprimir
	add ecx, 3
	dec eax
	jmp .calcularUnidades
	;ecx tiene las unidades
	
.imprimir:
	add ecx, 5		;en la pantalla empezamos en la quinta columna
	add edx, 3		;en la pantalla empezamos en la 3er fila
	
.imprimirTarea1:	
	cmp ebx, 1
	jne .imprimirTarea2
	IMPRIMIR_TEXTO textoCodigo, 1, colorVerde, edx, ecx
	jmp .fin
	
.imprimirTarea2:
	cmp ebx, 2
	jne .imprimirTarea3
	IMPRIMIR_TEXTO textoCodigo, 1, colorRojo, edx, ecx
	jmp .fin
	
.imprimirTarea3:
	cmp ebx, 3
	jne .imprimirTarea4
	IMPRIMIR_TEXTO textoCodigo, 1, colorCeleste, edx, ecx
	jmp .fin
	
.imprimirTarea4:
	cmp ebx, 4
	jne .imprimirTarea5
	IMPRIMIR_TEXTO textoCodigo, 1, colorAzul, edx, ecx
	jmp .fin
	
.imprimirTarea5:
	cmp ebx, 5
	jne .fin
	IMPRIMIR_TEXTO textoCodigo, 1, colorFucsia, edx, ecx
	jmp .fin
	
.fin:
	ret
	
pintar_stack:
	mov ebx, [esp+4]	; guardamos en ebx la tarea
	mov eax, [esp+8]	; guardamos en eax el indice del stack
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	;calculamos las decenas
	mov ecx, eax
	xor edx, edx
.calcularDecenas:
	cmp ecx, 10
	jl .unidades
	inc edx
	sub ecx, 10
	jmp .calcularDecenas
	; edx tiene las decenas
	
.unidades:
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx	;le restamos las decenas
	
	xor ecx, ecx
.calcularUnidades:
	cmp eax, 0
	je .imprimir
	add ecx, 3
	dec eax
	jmp .calcularUnidades
	;ecx tiene las unidades
	
.imprimir:
	add ecx, 5		;en la pantalla empezamos en la quinta columna
	add edx, 3		;en la pantalla empezamos en la 3er fila
	
.imprimirTarea1:	
	cmp ebx, 1
	jne .imprimirTarea2
	IMPRIMIR_TEXTO textoStack, 1, colorVerde, edx, ecx
	jmp .fin
	
.imprimirTarea2:
	cmp ebx, 2
	jne .imprimirTarea3
	IMPRIMIR_TEXTO textoStack, 1, colorRojo, edx, ecx
	jmp .fin
	
.imprimirTarea3:
	cmp ebx, 3
	jne .imprimirTarea4
	IMPRIMIR_TEXTO textoStack, 1, colorCeleste, edx, ecx
	jmp .fin
	
.imprimirTarea4:
	cmp ebx, 4
	jne .imprimirTarea5
	IMPRIMIR_TEXTO textoStack, 1, colorAzul, edx, ecx
	jmp .fin
	
.imprimirTarea5:
	cmp ebx, 5
	jne .fin
	IMPRIMIR_TEXTO textoStack, 1, colorFucsia, edx, ecx
	jmp .fin
	
.fin:
	ret
	
pintar_shared:
	mov ebx, [esp+4]	; guardamos en ebx la tarea
	mov eax, [esp+8]	; guardamos en eax el indice del shared
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	;calculamos las decenas
	mov ecx, eax
	xor edx, edx
.calcularDecenas:
	cmp ecx, 10
	jl .unidades
	inc edx
	sub ecx, 10
	jmp .calcularDecenas
	; edx tiene las decenas
	
.unidades:
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx	;le restamos las decenas
	
	xor ecx, ecx
.calcularUnidades:
	cmp eax, 0
	je .imprimir
	add ecx, 3
	dec eax
	jmp .calcularUnidades
	;ecx tiene las unidades
	
.imprimir:
	add ecx, 6		;en la pantalla empezamos en la quinta columna, pero los shared van en la parte derecha
	add edx, 3		;en la pantalla empezamos en la 3er fila
	
.imprimirTarea1:	
	cmp ebx, 1
	jne .imprimirTarea2
	IMPRIMIR_TEXTO textoShared, 1, colorVerde, edx, ecx
	jmp .fin
	
.imprimirTarea2:
	cmp ebx, 2
	jne .imprimirTarea3
	IMPRIMIR_TEXTO textoShared, 1, colorRojo, edx, ecx
	jmp .fin
	
.imprimirTarea3:
	cmp ebx, 3
	jne .imprimirTarea4
	IMPRIMIR_TEXTO textoShared, 1, colorCeleste, edx, ecx
	jmp .fin
	
.imprimirTarea4:
	cmp ebx, 4
	jne .imprimirTarea5
	IMPRIMIR_TEXTO textoShared, 1, colorAzul, edx, ecx
	jmp .fin
	
.imprimirTarea5:
	cmp ebx, 5
	jne .fin
	IMPRIMIR_TEXTO textoShared, 1, colorFucsia, edx, ecx
	jmp .fin
	
.fin:
	ret

limpiar_codigo:
	mov eax, cr3
	push eax
	call identificarTarea
	add esp, 4
	mov ebx, eax	; guardamos en ebx la tarea
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	mov eax, cr3
	push eax
	call posicionCodigo
	add esp,4
	;eax tiene el indice del codigo
	
	push eax
	push ebx
	call borrar_codigo
	add esp, 8

.fin:	
	ret

limpiar_stack:
	mov eax, cr3
	push eax
	call identificarTarea
	add esp, 4
	mov ebx, eax	; guardamos en ebx la tarea
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	mov eax, cr3
	push eax
	call posicionStack
	add esp,4
	;eax tiene el indice del stack
	
	push eax
	push ebx
	call borrar_stack
	add esp, 8

.fin:	
	ret
	
limpiar_shared:
	mov eax, cr3
	push eax
	call identificarTarea
	add esp, 4
	mov ebx, eax	; guardamos en ebx la tarea
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	mov eax, cr3
	push eax
	call posicionShared
	add esp,4
	;eax tiene el indice del shared
	
	push eax
	push ebx
	call borrar_shared
	add esp, 8

.fin:	
	ret

borrar_codigo:
	mov ebx, [esp+4]	; guardamos en ebx la tarea
	mov eax, [esp+8]	; guardamos en eax el indice del codigo
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	;calculamos las decenas
	mov ecx, eax
	xor edx, edx
.calcularDecenas:
	cmp ecx, 10
	jl .unidades
	inc edx
	sub ecx, 10
	jmp .calcularDecenas
	; edx tiene las decenas
	
.unidades:
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx	;le restamos las decenas
	
	xor ecx, ecx
.calcularUnidades:
	cmp eax, 0
	je .imprimir
	add ecx, 3
	dec eax
	jmp .calcularUnidades
	;ecx tiene las unidades
	
.imprimir:
	add ecx, 5		;en la pantalla empezamos en la quinta columna
	add edx, 3		;en la pantalla empezamos en la 3er fila
	
	IMPRIMIR_TEXTO espacioBlanco, 1, fondoNegro, edx, ecx
	jmp .fin
	
.fin:
	ret

borrar_stack:
	mov ebx, [esp+4]	; guardamos en ebx la tarea
	mov eax, [esp+8]	; guardamos en eax el indice del stack
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	;calculamos las decenas
	mov ecx, eax
	xor edx, edx
.calcularDecenas:
	cmp ecx, 10
	jl .unidades
	inc edx
	sub ecx, 10
	jmp .calcularDecenas
	; edx tiene las decenas
	
.unidades:
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx	;le restamos las decenas
	
	xor ecx, ecx
.calcularUnidades:
	cmp eax, 0
	je .imprimir
	add ecx, 3
	dec eax
	jmp .calcularUnidades
	;ecx tiene las unidades
	
.imprimir:
	add ecx, 5		;en la pantalla empezamos en la quinta columna
	add edx, 3		;en la pantalla empezamos en la 3er fila
	
	IMPRIMIR_TEXTO espacioBlanco, 1, fondoNegro, edx, ecx
	jmp .fin
	
.fin:
	ret
	
borrar_shared:
	mov ebx, [esp+4]	; guardamos en ebx la tarea
	mov eax, [esp+8]	; guardamos en eax el indice del shared
	
	cmp ebx, 1
	jl .fin
	cmp ebx, 5
	jg .fin			; validamos que estemos una tarea y evitamos errores con idle
	
	;calculamos las decenas
	mov ecx, eax
	xor edx, edx
.calcularDecenas:
	cmp ecx, 10
	jl .unidades
	inc edx
	sub ecx, 10
	jmp .calcularDecenas
	; edx tiene las decenas
	
.unidades:
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx
	sub eax, edx	;le restamos las decenas
	
	xor ecx, ecx
.calcularUnidades:
	cmp eax, 0
	je .imprimir
	add ecx, 3
	dec eax
	jmp .calcularUnidades
	;ecx tiene las unidades
	
.imprimir:
	add ecx, 6		;en la pantalla empezamos en la quinta columna pero los shared van en la parte derecha
	add edx, 3		;en la pantalla empezamos en la 3er fila
	
	IMPRIMIR_TEXTO espacioBlanco, 1, fondoNegro, edx, ecx
	jmp .fin
	
.fin:
	ret
